perm filename STEP5.SAI[DOC,TOB] blob sn#078288 filedate 1973-12-14 generic text, type T, neo UTF8
00100	comment
00200		this package generates fake edges in an array
00300		The variables involved are:
00400			step_amplitude    the step half height
00500			step_mean	mean value of step
00600			noise_std	rms error of gaussian noise
00700			theta		angle of edge
00800			rho		perpendicular distance of edge
00900			lambda		the wavelength transverse to edge
01000	
01100	the perpendicular distance from the edge is
01200		n→.r→+rho
01300		cx*x+cy*y+rho
01400	in terms of normal;
     

00100	REQUIRE "RANDOM.HDR[S,TOB]" SOURCE_FILE;
00200	
00300	SHORT REAL PROCEDURE GAUSS;
00350	comment gaussian random number, true gaussian distribution;
00400	BEGIN "GAUSS"
00500	RETURN (SQRT(-2.0*LOG(RANDOM))*SIN(TWOPI*RANDOM));
00600	END "GAUSS";
00700	
00800	SHORT REAL PROCEDURE NOISE(SHORT REAL VALUE,NOISE_STD);
00850	comment gaussian noise;
00900	BEGIN "NOISE"
01000	RETURN (VALUE+GAUSS*NOISE_STD);
01100	END "NOISE";
01200	
01300	SHORT REAL PROCEDURE STEP_FUN(SHORT REAL STEP_MEAN,
01400		STEP_AMPLITUDE,PHASE);
01450	comment step function with linear shift between;
01500	BEGIN "STEP"
01555	IF PHASE>1.0 THEN PHASE←1.0;
01560	IF PHASE<-1.0 THEN PHASE←-1.0;
01565	RETURN (PHASE*STEP_AMPLITUDE+STEP_MEAN);
01900	END "STEP";
02000	
02100	SHORT REAL PROCEDURE NOISY_STEP( SHORT REAL STEP_MEAN,
02200		STEP_AMPLITUDE,PHASE,NOISE_STD);
02250	comment noisy step function;
02300	BEGIN 
02400	RETURN(NOISE(STEP_FUN(STEP_MEAN,STEP_AMPLITUDE,PHASE),NOISE_STD));
02500	END;
02600	
02700	
02800	
02900	COMMENT MAKE UP A STEP EDGE (OF TYPE FUNARG, IE STEP OR COS)
03000	        ABOUT A LINE SPECIFIED BY
03100		STEP_THETA,STEP_RHO WITH WAVELENGTH LAMBDA;
03200	
03300	PROCEDURE FAKE (SHORT INTEGER ROWS,COLUMNS;SHORT REAL THETA,RHO,LAMBDA,
03400		STEP_MEAN,STEP_AMPLITUDE,NOISE_STD;
03500		REAL PROCEDURE FUNARG;INTEGER ARRAY VALUES);
03600	BEGIN "FAKE"
03700	SHORT REAL PHASE;
03800		REAL X0,Y0,X1,COSA,SINA;
03900		SHORT INTEGER VALUE;
04000		SHORT INTEGER VMAX;
04100		INTEGER PTR,PTR1;
04200		INTEGER ROW,COLUMN;
04300		LABEL FKSTR;
04400		VMAX←2↑BITS-1;
04500		COSA←COS(THETA);
04600		SINA←SIN(THETA);
04700	IFC 0 THENC 	PRINT(THETA);PRINT(COSA);PRINT(SINA);TCRLF;ENDC;
04800		X0←(COLUMNS+1)*0.5;
04900		Y0←(ROWS+1)*0.5;
05000	
05100		PTR←BPOINT(BITS,VALUES[1],0);
05200		FOR COLUMN←1 STEP 1 UNTIL COLUMNS DO BEGIN
05300		PTR1←PTR;
05400		PTR←PTR+LINLEN;
05500		X1←(COLUMN-X0)*COSA+RHO;
05600		FOR ROW←1 STEP 1 UNTIL ROWS DO BEGIN
05700		PHASE←X1+(ROW-Y0)*SINA;
05800		VALUE←0.5+NOISY_STEP(STEP_MEAN,STEP_AMPLITUDE,PHASE,NOISE_STD);
05900		IF VALUE<0 THEN VALUE←0;
06000		IF VALUE>VMAX THEN VALUE←VMAX;
06100	FKSTR:	IDPB(VALUE,PTR1);
06300	IFC  0 THENC PRINT(ROW);PRINT(COLUMN);PRINT(PHASE);PRINT(STEP_VALUE);PRINT(CRLF);INCHWL; ENDC;
06400		END;
06500		END;
06600	END "FAKE";
06700